/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


import java.util.InputMismatchException;
import java.util.Scanner;

/**
 *
 * @author Luisa Portillo
 */
public class StackWicha {
    /**
     * @param args the command line arguments
     */
    // 
    
    static StackL <Double> operador = new StackL <Double>();
    
    public static void main(String[] args) {
        // TODO code application logic here
        // Creacion de objetos
		Scanner in = new Scanner(System.in);
		
                
	// Declaracion de variables
	int r, r2;
        double num1, num2;
        
	do{
            menu();
            r = (int)obtenerNumero("¿Que opcion desea realizar? ", true);
            switch(r){
                
            case 1:
                num1 = (int)obtenerNumero("Ingrese el primer numero: \n ", true);
                operador.push(num1);
                num2 = (int)obtenerNumero("Ingrese el segundo numero: \n ", true);
                operador.push(num2);
                operarNumeros();
                break;
                
            case 2:
                if(!operador.isEmpty()){
                    num2 = (double)obtenerNumero("Ingrese el numero: \n ", true);
                    operador.push(num2);
                    operarNumeros();
                }
                else{
                    System.out.println("No se ha guardado ningun resultado.");
                }
                break;

            case 3:
                System.out.println();
                System.out.println("\nHASTA PRONTO.\n");
                System.out.println();
                
            break;
            default:
            System.out.print("\nOPCION INVALIDA\n");
            break;
            }
	}while(r!=3);
    }

    // Metodo que permite realizar las distintas operaciones con los numeros ingresados
    public static void operarNumeros(){
        double d1,d2;
        double res=0;
        int r2;
        menu2();
        r2 = (int)obtenerNumero("¿Que operacion desea realizar? \n ", true);
        
        //Retira los dos numeros ingresados para ser operados
        d2 = operador.pop();
        d1 = operador.pop();
        
        // Realiza las distintas operaciones
        if(r2>0 && r2<5){
            switch(r2){
                //Se realiza una suma
                case 1:
                    res = d1 + d2;
                    break;
                //Se realiza una resta
                case 2:
                    res = d1 - d2;
                    break;
                //Se multiplican los numeros
                case 3:
                    res = d1 * d2;
                    break;
                //Se dividen los numeros
                case 4:
                    //Divide los numeros, si existe una division por cero no realiza la operacion
                    if(d2==0){
                        System.out.println("Se esta realizando una division por cero, no es permitido.");
                    }
                    else{
                        res = d1/d2;
                    }
                    break;
                default:
                    System.out.println("No es una opcion del menu, vuelva a intentarlo.\n");
             }
            System.out.println("El resultado de la operacion realizada es:" + res);
    
            //Introduce el resultado en la primera casilla del Stack.
            operador.push(res);
        }
                
        else{
            System.out.println("No es una opcion del menu, vuelva a intentarlo.\n");
        }
    
    
    
    }
    
    // Menu
    public static void menu(){
	
        System.out.println();
	System.out.println("+---------------------------------------+");
	System.out.println("+--- Calculadora con formato postfix ---+");
	System.out.println("+---------------------------------------+");
	System.out.println("| 1. Realizar nueva operacion.          |");
        System.out.println("| 2. Continuar con operacion anterior.  |");
	System.out.println("| 3. Salir del programa.                |");
	System.out.println("+---------------------------------------+");
    }
                
    // Menu para realizar operaciones
    public static void menu2(){
	
	System.out.println();
	System.out.println("+--------------------------------+");
	System.out.println("+--------   Operaciones  --------+");
	System.out.println("+--------------------------------+");
	System.out.println("| 1. Sumar.                      |");
	System.out.println("| 2. Restar.                     |");
        System.out.println("| 3. Multiplicar.                |");
	System.out.println("| 4. Dividir.                    |");
	System.out.println("+--------------------------------+");
    }
    
    
    public static double obtenerNumero(String mensaje, boolean mostrar){
        Scanner ingreso = new Scanner(System.in);
        double num = -1;
        
        System.out.print(mensaje);
        try{
            num = ingreso.nextDouble();
        }
        catch(InputMismatchException exception){
            if (mostrar)
                System.out.println("\n ERROR:  Dato invalido. \n");
        }
        finally{
            ingreso.nextLine();//Atrapa el ENTER
        }
        return num;
    }
}
